/**
 * 字符串工具
 */
const StringUtils = {
    /**
     * 获取模板{}这样的正则匹配式
     * @returns {RegExp} 正则匹配器
     * @private
     */
    __getRegExp__: () => new RegExp("{[0-9]+}","g"),
    /**
     *  格式化字串
     * @param str 字串
     * @param args 参数
     * @returns {void | string | *} 格式化结果
     */
    format( str , args){
        let temp = null;
        let result = str;
        let regExp = this.__getRegExp__();
        do{
            temp = regExp.exec(str);
            if(temp == null){
                break;
            }
            temp = temp[0];
            let position = Number(temp.substr(1,temp.length - 2));
            result = result.replace(temp,args[position])
        }while ( true ) ;
        return result;
    },
    /**
     * 固定长度
     * @param str 字串
     * @param length 需要固定的长度
     * @param join 空白填充字串
     * @param left true - 左对齐
     * @returns {string} 固定长度的字段
     */
    fixLength( str, length ,join, left ) {
        if (!join) {
            join = '';
        }
        let temp = new Array(length).join(join);
        let result = left? str+ temp : temp + str;
        return left?
            result.substring(0,length):
            result.slice(-length);
    },
    /**
     * 判断是否为字串对象
     * @param obj 对象
     * @returns {boolean|boolean} true - 为字串
     */
    isString( obj ){
        return typeof obj === 'string' && obj.constructor === String;
    },
    /**
     * 将字串改为 utf8 字符数组
     * @param str 字串
     * @returns {[]} utf8字符数组
     */
    toByteArrayWithUtf8(str){
        let bytes = [];
        let len, c;
        len = str.length;
        for(let i = 0; i < len; i++) {
            c = str.charCodeAt(i);
            if(c >= 0x010000 && c <= 0x10FFFF) {
                bytes.push(((c >> 18) & 0x07) | 0xF0);
                bytes.push(((c >> 12) & 0x3F) | 0x80);
                bytes.push(((c >> 6) & 0x3F) | 0x80);
                bytes.push((c & 0x3F) | 0x80);
            } else if(c >= 0x000800 && c <= 0x00FFFF) {
                bytes.push(((c >> 12) & 0x0F) | 0xE0);
                bytes.push(((c >> 6) & 0x3F) | 0x80);
                bytes.push((c & 0x3F) | 0x80);
            } else if(c >= 0x000080 && c <= 0x0007FF) {
                bytes.push(((c >> 6) & 0x1F) | 0xC0);
                bytes.push((c & 0x3F) | 0x80);
            } else {
                bytes.push(c & 0xFF);
            }
        }
        return bytes;
    },
    /**
     * 获取字串utf8状态下的真实长度
     * @param str 字串
     * @returns {number} 长度值
     */
    getLength(str){
        return this.toByteArrayWithUtf8(str).length;
    }
};

export default StringUtils;